﻿using System;
using StockholmsStad.Utilities.Enums;

namespace StockholmsStad.Utilities.Exceptions
{
    /// <summary>
    /// Det exception som kastas då fatala fel inträffar. Som t ex sqlexception
    /// argumentnull-exception osv. 
    /// </summary>
    [Serializable]
    public class StockholmStadApplicationException : ApplicationException
    {
        private string message;

        /// <summary>
        /// Hämtar eller sätter typ av felkod av aktuellt exception.
        /// </summary>
        public ApplicationErrorCode ErrorCode { get; set; }

        /// <summary>
        /// Hämtar eller sätter felmeddelande av aktuellt exception.
        /// </summary>
        public string ErrorMessage
        {
            get
            {
                if (string.IsNullOrEmpty(message))
                {
                    if (InnerException != null)
                        message = InnerException.InnerException != null ? string.Format("{0}, detaljer: {1}", InnerException, InnerException.InnerException.Message) : InnerException.Message;
                    else
                        message = base.Message;
                }

                return message;
            }
            set
            {
                message = value;
            }
        }

        /// <summary>
        /// Hämtar eller sätter allvarhetsgraden av aktuellt exception.
        /// </summary>
        public Severity Severity { get; set; }

        /// <summary>
        /// Överlagrad. Initialiserar en ny instans av <see cref="StockholmStadApplicationException"/> klassen. 
        /// </summary>
        /// <param name="errorCode">Felkoden som anger typen av fel som inträffat</param>
        /// <param name="severity">Allvarsgraden av felet</param>
        public StockholmStadApplicationException(ApplicationErrorCode errorCode, Severity severity)
            : base(string.Format("A StockholmStadApplicationException of type {0} was thrown", errorCode))
        {
            ErrorCode = errorCode;
            Severity = severity;
        }

        /// <summary>
        /// Överlagrad. Initialiserar en ny instans av <see cref="StockholmStadApplicationException"/> klassen. 
        /// </summary>
        /// <param name="errorCode">Felkoden som anger typen av fel som inträffat</param>
        /// <param name="severity">Allvarsgraden av felet</param>
        /// <param name="message"></param>
        /// <param name="e">Det exception som är anledningen till aktuellt exception.</param>
        public StockholmStadApplicationException(ApplicationErrorCode errorCode, Severity severity, string message, Exception e)
            : base(string.Format("A StockholmStadApplicationException of type {0} was thrown", errorCode), e)
        {
            ErrorCode = errorCode;
            ErrorMessage = message;
            Severity = severity;
        }
    }
}
